home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / ping / sigalarm.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  52 lines

  1. /*
  2.  * This routine causes another PING to be transmitted, and then
  3.  * schedules another SIGALRM for 1 second from now.
  4.  *
  5.  *     Our sense of time will slowly skew (i.e., packets will not be launched
  6.  *     exactly at 1-second intervals).  This does not affect the quality
  7.  *    of the delay and loss statistics.
  8.  */
  9.  
  10. #include    "defs.h"
  11.  
  12. sig_alarm()
  13. {
  14.     int    waittime;
  15.  
  16.     send_ping();        /* first send another packet */
  17.  
  18.     if (npackets == 0 || ntransmitted < npackets)
  19.         /*
  20.          * If we're not sending a fixed number of packets,
  21.          * or if we are sending a fixed number but we've still
  22.          * got more to send, schedule another signal for 1 second
  23.          * from now.
  24.          */
  25.  
  26.         alarm(1);
  27.  
  28.     else {
  29.         /*
  30.          * We've sent the specified number of packets.
  31.          * But, we can't just terminate, as there is at least one
  32.          * packet still to be received (the one we sent at the
  33.          * beginning of this function).
  34.          * If we've received at least one packet already, then
  35.          * wait for 2 times the largest round-trip time we've seen
  36.          * so far.  Otherwise we haven't received anything yet from
  37.          * the host we're pinging, so just wait 10 seconds.
  38.          */
  39.  
  40.         if (nreceived) {
  41.             waittime = 2 * tmax / 1000;    /* tmax is millisec */
  42.             if (waittime == 0)
  43.                 waittime = 1;
  44.         } else
  45.             waittime = MAXWAIT;
  46.  
  47.         signal(SIGALRM, sig_finish);    /* change the signal handler */
  48.         alarm(waittime);        /* schedule the signal */
  49.     }
  50.     return;
  51. }
  52.